home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Text⁄Files / File List 14 / Window.c < prev    next >
Text File  |  1990-09-14  |  7KB  |  328 lines

  1. /*
  2.     FileList 1.4
  3.     "Window.c"
  4. */
  5.  
  6. #include "Main.h"
  7. #include "Mouse.h"
  8. #include "Stack.h"
  9. #include "Search.h"
  10. #include "Window.h"
  11.  
  12. #define BAR        15        /* Scroll bar width - 1 */
  13. #define LEFT    3        /* Left margin of text in window */
  14.  
  15. /* ----- Invert rectangle using current hilite color ------------------- */
  16.  
  17. pascal void myInvertRect (Rect *) = {
  18.     0x08B8, 0x0007, 0x0938,                /* BCLR #hiliteBit,HiliteMode */
  19.     0xA8A4 };                             /* _InvertRect */
  20.  
  21. /* ----- Return content rectangle -------------------------------------- */
  22.  
  23. void ContentRect (
  24.     register WindowPtr w,
  25.     register Rect *r)
  26. {
  27.     *r = w->portRect;
  28.     r->top += BAR;
  29.     r->bottom -= BAR;
  30.     r->right -= BAR;
  31. }
  32.  
  33. /* ----- Return content + header rectangle ----------------------------- */
  34.  
  35. void ContentHeaderRect (
  36.     register WindowPtr w,
  37.     register Rect *r)
  38. {
  39.     *r = w->portRect;
  40.     r->bottom -= BAR;
  41.     r->right -= BAR;
  42. }
  43.  
  44. /* ----- Return vertical scroll bar rectangle -------------------------- */
  45.  
  46. void VScrollRect (
  47.     register WindowPtr w,
  48.     register Rect *r)
  49. {
  50.     *r = w->portRect;
  51.     r->top -= 1;
  52.     r->bottom -= BAR - 1;
  53.     r->right +=1;
  54.     r->left = r->right - BAR - 1;
  55. }
  56.  
  57. /* ----- Return horizontal scroll bar rectangle ------------------------ */
  58.  
  59. void HScrollRect (
  60.     register WindowPtr w,
  61.     register Rect *r)
  62. {
  63.     *r = w->portRect;
  64.     r->bottom += 1;
  65.     r->top = r->bottom - BAR - 1;
  66.     r->left -= 1;
  67.     r->right -= BAR - 1;
  68. }
  69.  
  70. /* ----- Return header line rectangle ---------------------------------- */
  71.  
  72. void HeaderRect (
  73.     register WindowPtr w,
  74.     register Rect *r)
  75. {
  76.     *r = w->portRect;
  77.     r->bottom = r->top + BAR;
  78.     r->right -= BAR;
  79. }
  80.  
  81. /* ----- Return a correct window port rectangle ------------------------ */
  82.  
  83. void WPortRect (
  84.     register short v,
  85.     register short h,
  86.     register Rect *r)
  87. {
  88.     r->bottom = r->top + v*((r->bottom - r->top - 2*BAR)/v) + 2*BAR;
  89.     r->right = r->left + h*((r->right - r->left - BAR)/h) + BAR + LEFT;
  90. }
  91.  
  92. /* ----- Set window size ----------------------------------------------- */
  93.  
  94. void SetWindowSize (
  95.     register WindowDataPtr w,
  96.     register short width,
  97.     register short heigth)
  98. {
  99.     Rect r;
  100.  
  101.     SetPort((WindowPtr)w);
  102.     EraseRect(&((WindowPtr)w)->portRect);
  103.     r.top = r.left = 0;
  104.     r.bottom = heigth;
  105.     r.right = width;
  106.     WPortRect(w->height, w->width, &r);
  107.     SizeWindow(w, r.right - r.left, r.bottom - r.top, TRUE);
  108.     InvalRect(&((WindowPtr)w)->portRect);
  109.     FixScrollBar(w);    /* Resize window's scroll bar */
  110.     AdjustScrollBar(w);    /* Adjust scroll bars to size of document */
  111. }
  112.  
  113. /* ----- Redraw one line only (used by vertical scroll) ---------------- */
  114.  
  115. void RedrawV1 (
  116.     register WindowDataPtr p,
  117.     short dir)
  118. {
  119.     register short y, n;
  120.     register long v;
  121.     register unsigned char string[256];
  122.     Rect r;
  123.     
  124.     ContentRect((WindowPtr)p, &r);
  125.     if ((n = (r.bottom - r.top)/p->height - 1) < 0)    /* Lines - 1 */
  126.         return;
  127.     v = GetCtlValue(p->vs);                    /* First line */
  128.     y = r.top + p->height - p->descent;        /* Position of first line */
  129.     if (dir < 0) {
  130.         v += n;                                /* Last Line */
  131.         y += n * p->height;                    /* Position of last line */
  132.     }
  133.     if (v >= p->count)
  134.         return;
  135.     SetPort(p);
  136.     MoveTo(LEFT - GetCtlValue(p->hs) * p->width, y);
  137.     (*(p->redraw))(v, string);
  138.     DrawString(string);
  139.     if (Selected(p, v)) {
  140.         r.bottom = y + p->descent;
  141.         r.top = r.bottom - p->height;
  142.         myInvertRect(&r);
  143.     }
  144. }
  145.  
  146. /* ----- Reformat and redraw all window data --------------------------- */
  147.  
  148. void RedrawV (
  149.     register WindowDataPtr p,
  150.     Boolean full)
  151. {
  152.     register short x, y, n;
  153.     register long v;
  154.     register unsigned char string[256];
  155.     register StringHandle title;
  156.     Rect r;
  157.     RgnHandle clip;
  158.  
  159.     SetPort(p);
  160.     x = LEFT - GetCtlValue(p->hs) * p->width;
  161.  
  162.     HeaderRect((WindowPtr)p, &r);
  163.     MoveTo(0, r.bottom - 1);
  164.     LineTo(r.right, r.bottom - 1);    /* Draw separation line */
  165.     MoveTo(x, r.bottom - p->descent - 2);
  166.     if (title = GetString(p->header)) {
  167.         HLock(title);
  168.         DrawString(*title);
  169.         HUnlock(title);
  170.     }
  171.  
  172.     ContentRect((WindowPtr)p, &r);
  173.     if ((n = (r.bottom - r.top)/p->height) <= 0)    /* Lines */
  174.         return;
  175.     if (full) {
  176.         clip = ((WindowPtr)p)->clipRgn;
  177.         ((WindowPtr)p)->clipRgn = NewRgn();
  178.         RectRgn(((WindowPtr)p)->clipRgn, &r);
  179.     }
  180.     v = GetCtlValue(p->vs);                    /* First line */
  181.     y = r.top + p->height - p->descent;        /* Position of first line */
  182.     while (n--) {
  183.         if (v >= p->count)
  184.             break;
  185.         MoveTo(x, y);
  186.         (*(p->redraw))(v, string);
  187.         DrawString(string);
  188.         if (Selected(p, v) && p == (WindowDataPtr)FrontWindow()) {
  189.             r.bottom = y + p->descent;
  190.             r.top = r.bottom - p->height;
  191.             myInvertRect(&r);
  192.         }
  193.         y += p->height;
  194.         v++;
  195.     }
  196.     if (full) {
  197.         DisposeRgn(((WindowPtr)p)->clipRgn);
  198.         ((WindowPtr)p)->clipRgn = clip;
  199.     }
  200. }
  201.  
  202. /* ----- Draw selection ------------------------------------------------ */
  203.  
  204. void DrawSelection (register WindowDataPtr p)
  205. {
  206.     register long i;
  207.     register long n1, n2;
  208.     Rect r;
  209.  
  210.     if ((i = p->select) == -1L)
  211.         return;
  212.     ContentRect((WindowPtr)p, &r);
  213.     n2 = (n1 = GetCtlValue(p->vs)) + (r.bottom - r.top)/p->height;
  214.     if (n2 >= p->count)
  215.         n2 = p->count;
  216.     if (n1 <= i && i < n2) {    /* If it is visible */
  217.         r.top += (i - n1) * p->height;
  218.         r.bottom = r.top + p->height;
  219.         InvalRect(&r);
  220.     }
  221. }
  222.  
  223. /* ----- Toggle selection ---------------------------------------------- */
  224.  
  225. void ToggleIt (
  226.     register WindowDataPtr p,
  227.     register long i)
  228. {
  229.     register long n1, n2;
  230.     Rect r;
  231.  
  232.     ContentRect((WindowPtr)p, &r);
  233.     n2 = (n1 = GetCtlValue(p->vs)) + (r.bottom - r.top)/p->height;
  234.     if (n2 >= p->count)
  235.         n2 = p->count;
  236.     if (i < p->count)
  237.         Toggle(p, i);
  238.     if (n1 <= i && i < n2) {    /* If it is visible */
  239.         r.top += (i - n1) * p->height;
  240.         r.bottom = r.top + p->height;
  241.         myInvertRect(&r);
  242.     }
  243. }
  244.  
  245. /* ----- Find selection ------------------------------------------------ */
  246.  
  247. static long FindIt (
  248.     register WindowDataPtr p,
  249.     Point position)
  250. {
  251.     register long v;
  252.     Rect r;
  253.  
  254.     ContentRect((WindowPtr)p, &r);
  255.     v = GetCtlValue(p->vs) + (position.v - r.top)/p->height;
  256.     if (v >= p->count)
  257.         return -1L;
  258.     return v;
  259. }
  260.  
  261. /* ----- Row selection ------------------------------------------------- */
  262.  
  263. void FindRow (
  264.     register WindowDataPtr p,
  265.     Point position)                /* Local coordinates */
  266. {
  267.     register long v;
  268.     RgnHandle clip;
  269.     Rect r;
  270.  
  271.     SetPort(p);
  272.     ContentRect((WindowPtr)p, &r);
  273.     clip = ((WindowPtr)p)->clipRgn;
  274.     ((WindowPtr)p)->clipRgn = NewRgn();
  275.     RectRgn(((WindowPtr)p)->clipRgn, &r);
  276.  
  277.     if ((v = FindIt(p, position)) != -1L) {
  278.         if (p->select != v && p->select != -1L)
  279.                 ToggleIt(p, p->select);
  280.         ToggleIt(p, v);
  281.     }
  282.  
  283.     DisposeRgn(((WindowPtr)p)->clipRgn);
  284.     ((WindowPtr)p)->clipRgn = clip;
  285. }
  286.  
  287. /* ----- Restore original window position and size --------------------- */
  288.  
  289. void RestoreWindow (register WindowDataPtr p)
  290. {
  291.     SetPort(p);
  292.     HideWindow(p);
  293.     MoveWindow(p, p->rectangle.left, p->rectangle.top, TRUE);
  294.     SetWindowSize(p,
  295.         p->rectangle.right - p->rectangle.left,
  296.         p->rectangle.bottom - p->rectangle.top);
  297.     ShowWindow(p);
  298. }
  299.  
  300. /* ----- Move to selection --------------------------------------------- */
  301.  
  302. void MoveToLine (register WindowDataPtr w, unsigned long v)
  303. {
  304.     register short y1, y2;
  305.     Rect r;
  306.  
  307.     y1 = GetCtlValue(w->vs);
  308.     ContentRect((WindowPtr)w, &r);
  309.     y2 = y1 + (r.bottom - r.top)/w->height;
  310.     if (v < y1 || v >= y2) {
  311.         SetCtlValue(w->vs, v - (y2 - y1)/2);
  312.         SetPort(w);
  313.         InvalRect(&r);
  314.     }
  315. }
  316.  
  317. /* ----- Move to selection --------------------------------------------- */
  318.  
  319. void Selection (void)
  320. {
  321.     register unsigned long v;
  322.     register WindowDataPtr w = (WindowDataPtr)FrontWindow();
  323.  
  324.     if ((v = w->select) == -1)
  325.         return;
  326.     MoveToLine(w, v);
  327. }
  328.